AWS Backupを使ってEC2のバックアップをクロスリージョンにコピーする設定をCloudFormationで作成してみた
AWS Backupのクロスリージョンコピー設定を行う機会があったのでブログに残します。
構成
簡単な構成図ですが以下のようなことをやります。
1. 東京リージョンにあるEC2からAWS BackupでAMIを取得
2. 大阪リージョンのバックアップボールトに東京リージョンで取得したAMIをコピー
3. 大阪リージョンのVPCでEC2を復旧
上記1、2を行うAWS Backupの設定と構成図の環境をCloudFormationで作成していきます。
3については以下の公式ドキュメントの手順でバックアップボールトにある復旧ポイントから復旧を行います。
Amazon EC2 インスタンスを復元する
設定
まずは東京リージョンにVPC、EC2などを作成します。
作成は以下のCloudFormationテンプレートで作成します。
CloudFormationテンプレート (ここをクリックしてください)
AWSTemplateFormatVersion: "2010-09-09" Description: EC2 Stack Metadata: # ------------------------------------------------------------# # Metadata # ------------------------------------------------------------# AWS::CloudFormation::Interface: ParameterGroups: - Label: default: Parameters for VPC Parameters: - VPCCIDR - Label: default: Parameters for Subnet Parameters: - PublicSubnet01CIDR - Label: default: Parameters for Security Group Parameters: - MyIP - Label: default: Parameters for EC2 Parameters: - EC2VolumeSize - EC2VolumeIOPS - EC2AMI - EC2InstanceType Parameters: # ------------------------------------------------------------# # Parameters # ------------------------------------------------------------# VPCCIDR: Default: 172.16.0.0/16 Type: String PublicSubnet01CIDR: Default: 172.16.0.0/24 Type: String MyIP: Type: String EC2VolumeSize: Default: 30 Type: Number EC2VolumeIOPS: Default: 3000 Type: Number EC2AMI: Default: ami-0329eac6c5240c99d Type: AWS::EC2::Image::Id EC2InstanceType: Default: t3.micro Type: String Resources: # ------------------------------------------------------------# # VPC # ------------------------------------------------------------# VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VPCCIDR EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: backup-test-ap-northeast-1 # ------------------------------------------------------------# # InternetGateway # ------------------------------------------------------------# InternetGateway: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: backup-test-igw-ap-northeast-1 InternetGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref InternetGateway VpcId: !Ref VPC # ------------------------------------------------------------# # Subnet # ------------------------------------------------------------# PublicSubnet01: Type: AWS::EC2::Subnet Properties: AvailabilityZone: ap-northeast-1a CidrBlock: !Ref PublicSubnet01CIDR MapPublicIpOnLaunch: true Tags: - Key: Name Value: backup-test-public-subnet-01-ap-northeast-1 VpcId: !Ref VPC # ------------------------------------------------------------# # RouteTable # ------------------------------------------------------------# PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: backup-test-public-rtb-ap-northeast-1 PublicRouteTableRoute1: Type: AWS::EC2::Route Properties: DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway RouteTableId: !Ref PublicRouteTable PublicRtAssociation1: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref PublicRouteTable SubnetId: !Ref PublicSubnet01 # ------------------------------------------------------------# # IAM # ------------------------------------------------------------# EC2IAMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - ec2.amazonaws.com Action: - 'sts:AssumeRole' ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore RoleName: iam-role-ec2 Tags: - Key: Name Value: iam-role-ec2 EC2IAMInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: InstanceProfileName: iam-instanceprofile-ec2 Roles: - !Ref EC2IAMRole # ------------------------------------------------------------# # Security Group # ------------------------------------------------------------# EC2SG: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: for ec2 GroupName: backup-test-sg-ec2-ap-northeast-1 SecurityGroupEgress: - CidrIp: 0.0.0.0/0 FromPort: -1 IpProtocol: -1 ToPort: -1 SecurityGroupIngress: - CidrIp: !Ref MyIP FromPort: 80 IpProtocol: tcp ToPort: 80 Tags: - Key: Name Value: backup-test-sg-ec2-ap-northeast-1 VpcId: !Ref VPC # ------------------------------------------------------------# # KeyPair # ------------------------------------------------------------# KeyPair: Type: AWS::EC2::KeyPair Properties: KeyName: backup-test-ec2-key-ap-northeast-1 KeyType: rsa Tags: - Key: Name Value: backup-test-ec2-key-ap-northeast-1 # ------------------------------------------------------------# # EC2 # ------------------------------------------------------------# EC2: Type: AWS::EC2::Instance Properties: BlockDeviceMappings: - DeviceName: /dev/xvda Ebs: DeleteOnTermination: true Encrypted: true Iops: !Ref EC2VolumeIOPS VolumeSize: !Ref EC2VolumeSize VolumeType: gp3 DisableApiTermination: false EbsOptimized: true IamInstanceProfile: !Ref EC2IAMInstanceProfile ImageId: !Ref EC2AMI InstanceType: !Ref EC2InstanceType KeyName: !Ref KeyPair NetworkInterfaces: - AssociatePublicIpAddress: true DeleteOnTermination: true DeviceIndex: 0 GroupSet: - !Ref EC2SG SubnetId: !Ref PublicSubnet01 Tags: - Key: Name Value: backup-test-ec2-1-ap-northeast-1 UserData: !Base64 | #!/bin/bash yum update -y yum install httpd -y systemctl enable httpd systemctl start httpd touch /var/www/html/index.html echo "backup ec2 ap-northeast-1" > /var/www/html/index.html
上記のテンプレートでは特別なことはせずシンプルにパブリックサブネット上にWebサーバーのEC2を起動するようにしています。
デプロイは以下のコマンドを実行します。
aws cloudformation create-stack --stack-name CloudFormationスタック名 --template-body file://CloudFormationテンプレートファイル名 --capabilities CAPABILITY_NAMED_IAM --parameters ParameterKey=MyIP,ParameterValue=WebサーバーへHTTPでアクセスする接続元のIPアドレス
作成完了後、EC2のパブリックIPアドレスにブラウザからアクセスすると画面に「backup ec2 ap-northeast-1」と表示されます。
確認ができたら大阪リージョンの方にVPCなどEC2を起動するための土台となるリソースとバックアップボールトを作成していきます。
作成は以下のCloudFormationテンプレートで作成します。
CloudFormationテンプレート (ここをクリックしてください)
AWSTemplateFormatVersion: "2010-09-09" Description: VPC Stack Metadata: # ------------------------------------------------------------# # Metadata # ------------------------------------------------------------# AWS::CloudFormation::Interface: ParameterGroups: - Label: default: Parameters for VPC Parameters: - VPCCIDR - Label: default: Parameters for Subnet Parameters: - PublicSubnet01CIDR - Label: default: Parameters for Security Group Parameters: - MyIP Parameters: # ------------------------------------------------------------# # Parameters # ------------------------------------------------------------# VPCCIDR: Default: 172.16.0.0/16 Type: String PublicSubnet01CIDR: Default: 172.16.0.0/24 Type: String MyIP: Type: String Resources: # ------------------------------------------------------------# # VPC # ------------------------------------------------------------# VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VPCCIDR EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: backup-test-ap-northeast-3 # ------------------------------------------------------------# # InternetGateway # ------------------------------------------------------------# InternetGateway: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: backup-test-igw-ap-northeast-3 InternetGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref InternetGateway VpcId: !Ref VPC # ------------------------------------------------------------# # Subnet # ------------------------------------------------------------# PublicSubnet01: Type: AWS::EC2::Subnet Properties: AvailabilityZone: ap-northeast-3a CidrBlock: !Ref PublicSubnet01CIDR MapPublicIpOnLaunch: true Tags: - Key: Name Value: backup-test-public-subnet-01-ap-northeast-3 VpcId: !Ref VPC # ------------------------------------------------------------# # RouteTable # ------------------------------------------------------------# PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: backup-test-public-rtb-ap-northeast-3 PublicRouteTableRoute1: Type: AWS::EC2::Route Properties: DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway RouteTableId: !Ref PublicRouteTable PublicRtAssociation1: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref PublicRouteTable SubnetId: !Ref PublicSubnet01 # ------------------------------------------------------------# # Security Group # ------------------------------------------------------------# EC2SG: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: for ec2 GroupName: backup-test-sg-ec2 SecurityGroupEgress: - CidrIp: 0.0.0.0/0 FromPort: -1 IpProtocol: -1 ToPort: -1 SecurityGroupIngress: - CidrIp: !Ref MyIP FromPort: 80 IpProtocol: tcp ToPort: 80 Tags: - Key: Name Value: backup-test-sg-ec2-ap-northeast-3 VpcId: !Ref VPC # ------------------------------------------------------------# # Backup # ------------------------------------------------------------# BackupVault: Type: AWS::Backup::BackupVault Properties: BackupVaultName: backup-test-vault-ap-northeast-3 Outputs: # ------------------------------------------------------------# # Outputs # ------------------------------------------------------------# BackupVaultName: Value: !Ref BackupVault Export: Name: BackupVaultName BackupVaultARN: Value: !GetAtt BackupVault.BackupVaultArn Export: Name: BackupVaultARN
バックアップボールトは133~136行目で作成しています。
デプロイは以下のコマンドを実行します。
aws cloudformation create-stack --stack-name CloudFormationスタック名 --template-body file://CloudFormationテンプレートファイル名 --parameters ParameterKey=MyIP,ParameterValue=WebサーバーへHTTPでアクセスする接続元のIPアドレス --region ap-northeast-3
大阪リージョンでデプロイするためコマンドのオプションで「--region ap-northeast-3」を付けています。
デプロイが完了したら東京リージョンにバックアップボールトと大阪リージョンにバックアップをコピーするバックアッププランを作成します。
作成は以下のCloudFormationテンプレートで作成します。
CloudFormationテンプレート (ここをクリックしてください)
AWSTemplateFormatVersion: "2010-09-09" Description: Backup Stack Parameters: # ------------------------------------------------------------# # Parameters # ------------------------------------------------------------# DestinationBackupVaultArn: Type: String Resources: # ------------------------------------------------------------# # Backup # ------------------------------------------------------------# BackupVault: Type: AWS::Backup::BackupVault Properties: BackupVaultName: backup-test-vault-ap-northeast-1 BackupPlan: Type: AWS::Backup::BackupPlan Properties: BackupPlan: BackupPlanName: backup-test-plan BackupPlanRule: - CompletionWindowMinutes: 180 CopyActions: - DestinationBackupVaultArn: !Ref DestinationBackupVaultArn Lifecycle: DeleteAfterDays: 1 Lifecycle: DeleteAfterDays: 1 RuleName: backup-ec2 ScheduleExpression: cron(0 13 * * ? *) StartWindowMinutes: 60 TargetBackupVault: !Ref BackupVault BackupIAMPolicy: Type: AWS::IAM::ManagedPolicy Properties: PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - "iam:PassRole" Resource: - "*" ManagedPolicyName: backup-policy BackupIamRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - backup.amazonaws.com Action: - 'sts:AssumeRole' ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores - !Ref BackupIAMPolicy RoleName: backup-role BackupSelectionEC2: Type: AWS::Backup::BackupSelection Properties: BackupPlanId: !Ref BackupPlan BackupSelection: IamRoleArn: !GetAtt BackupIamRole.Arn ListOfTags: - ConditionKey: Name ConditionType: STRINGEQUALS ConditionValue: backup-test-ec2-1-ap-northeast-1 SelectionName: backup-selection-ec2
21~37行目でバックアッププランを作成しています。
「CopyActions」でコピー先のバックアップボールトを指定しています。
39~68行目でAWS Backupがバックアップを取得したり復元したりするときに使用するIAM周りを作成しています。
IAMポリシーで「iam:PassRole」を付けているのは復元時にIAMロールをEC2へアタッチできるようにするためです。
70~80行目でバックアップを取得するリソースを設定しています。
今回はNameタグで「backup-test-ec2-1-ap-northeast-1」がついているものが対象になるように設定しました。
デプロイは以下のコマンドを実行します。
aws cloudformation create-stack --stack-name CloudFormationスタック名 --template-body file://CloudFormationテンプレートファイル名 --capabilities CAPABILITY_NAMED_IAM --parameters ParameterKey=DestinationBackupVaultArn,ParameterValue=コピー先バックアップボールトのARN (今回の場合は大阪リージョンのバックアップボールト)
デプロイが完了後、日本時間22時以降にバックアップが取得され始めます。
バックアップが完了すると以下の画像のようにバックアップボールトの復旧ポイントから確認することができます。
復元
復元は以下の公式ドキュメントの手順で行います。
Amazon EC2 インスタンスを復元する
まずはマネジメントコンソールでリージョンを大阪リージョンへ変更してAWS Backupのダッシュボードへ移動します。
移動後、画面左の項目から「保護されたリソース」をクリックします。
画面遷移後、復元する「リソースID」をクリックします。
画面遷移後、「復旧ポイント」を選択して右上にある「復元」をクリックします。
画面遷移後、「VPC」、「サブネット」、「セキュリティグループ」、ロールを復元で「ロール名」をCloudFormationで作成したものへ変更します。
「インスタンス IAM ロール」は元のIAMロールで復元にしておくことで東京リージョンで起動時に設定していたIAMロールが自動でアタッチされます。
※ロールを復元の選択を「デフォルトのロール」にするとIAMロールをアタッチする権限が無いため復元に失敗します。
変更後、画面下の「バックアップを復元」をクリックすると復元が開始されます。
復元が完了すると復元ジョブのステータスが「完了」になります。
復元が完了後、EC2のパブリックIPアドレスにブラウザからアクセスすると東京リージョンのEC2で確認した画面と同じものが表示されることが確認できます。
さいごに
クロスリージョンコピーはDR対策で使用するものになってくるので設定の流れを理解しておくとよいかと思いました。